package gbench.sandbox.plot;

import gbench.common.matlib.MatlibCanvas;
import gbench.common.matlib.MatlibCanvas.Range;

import static gbench.common.tree.LittleTree.IRecord.*;
import static gbench.common.tree.LittleTree.*;
import static gbench.common.matlib.img.ImageOps.*;

/**
 * 简单的绘图
 * @author gbench
 *
 */
public class JunitPlotBar {
    
    /**
     * 绘制条形图
     * @param dataframe 数据框 一维数据框{key,value} 结构
     */
    public void plot_bar(final IRecord dataframe) {
        final var size = 1000;
        final var height = size/2;
        final var bar_width = 0.8; // bar 的宽度这是一个百分比,空出的部分为 两个bar 之间的间隙。
        final var bar_height = 0.7; // bar 的高度这是一个百分比,占据y轴反向的绘图高度的百分数
        final var matlib = new MatlibCanvas(size);
        final var max = dataframe.collect(dbl_stats2(kv2dbl2)).getMax(); // 业务数据的数量上界下界默认为0。绘图的核心就是 建立 业务数据的数量 映射到  绘图区域的数量（采样点range)的  函数/比例关系
        
        // matlib.flip(); // 坐标轴反转
        matlib.plot(size, size / 2, pen -> {
            final var axis = Range.of(5, 400).limit(dataframe.size());// 绘图的区间范围即x的坐标范围，采样点限制在 即 limit 到 与data size 相对应
            System.out.println("x 轴的切分位点:"+axis.list(e->e));
            axis.map(kvp_int()).forEach( tup -> { // 为采样点增加索引编号，编号从0开始，于是采样点就与IRecord的索引号对应了，即采样点与kvp对应关联了
                final var x = tup._2(); // bar 的绘图x轴向的起点位置即左下角。由于已经关联了 kvp 业务数据，所以 y 按照取所对应索引号取数据就可以。
                final var y = (dataframe.dbl(tup._1())*height/max)*bar_height; // 提取y坐标值,数据向量的高度
                System.out.println(y);
                pen.drawPoints(Range.cph(Range.of(x, x + axis.step() * bar_width), Range.of(0, y)).map(matlib::xY));
            });// forEach
        });// plot
    }
    
    public static void main(String[] args) {
        final var data = REC(
            "一月销售",rndint(1000),
            "二月销售",rndint(1000),
            "三月销售",rndint(1000),
            "四月销售",rndint(1000),
            "五月销售",rndint(1000),
            "六月销售",rndint(1000)
        );// 源数据
        new JunitPlotBar().plot_bar(data);
    }

}
